package com.jinghangzz.shop.common.util;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
 * 爬虫工具类
 * http://tool.chinaz.com/:站长之家;
 * 
 * 工具:jsoup
 * @author TeaBig
 */
public class SpiderUtil
{
	/**
	 * 京东的商品列表页面;
	 * 要求返回值按照指定的格式拼接:(JSON)
{
	"code":"0",
	"info:"",
	"data":
	{
		"list":
		[
			{"name":"","price":"","imgPath":""}
		]
		,
		"totalPage":""
	}
}
	 * @return
	 */
	public JSONObject jdGoodsList(String cate,String sort,String page)
	{
		ConstatFinalUtil.SYS_LOGGER.info("==jdGoodsList==");
		JSONObject resultJSON = new JSONObject();
		/* 数据 */
		JSONObject dataJSON = new JSONObject();
		
		HttpUtil httpUtil = new HttpUtil();
		/*发件人的信封
		 * 发件人的信
		 * 回信的信封
		 * 回信的信
		 * */
		/* url:收件人地址 */
		String urlStr = "https://list.jd.com/list.html" ; 
		try
		{
			/* 每次休眠的时间都不一样 */
			Random random = new Random();
			int sleepInt = random.nextInt(3) + 3;
			Thread.sleep(sleepInt * 1000);
			ConstatFinalUtil.SYS_LOGGER.info("请求京东之前休眠:{}秒",sleepInt);
			
			/* 发件人的信封 */
			Map<String, String> headerMap = new HashMap<String, String>();
			/* 准备一堆userAgent,如果这个死掉,换另外一个 */
			headerMap.put("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
			
			/* 发件人的信
			 * a=1&b=2&c=3
			 *  */
			Map<String, String> parameterMap = new HashMap<String, String>();
			parameterMap.put("cat", cate);
			if(sort == null || "".equalsIgnoreCase(sort))
			{
				sort = "sort_rank_asc";
			}
			parameterMap.put("sort", sort);
			parameterMap.put("trans", "1");
			parameterMap.put("JL", "6_0_0");
			parameterMap.put("page", page) ;
			/* 回信的信封
			 *  */
			Map<String, String> responseMap = new HashMap<String, String>();
			/* 邮递员送信 */
			String response = httpUtil.methodGet(urlStr, headerMap, parameterMap, responseMap);
			//ConstatFinalUtil.SYS_LOGGER.info("回信:{}",response);
			/*=========准备一个集合叫商品列表========*/
			/* 解析html
			 * 返回值是document;和js中的document一样; */
			Document document = Jsoup.parse(response);
			/* 获取商品明细
			 * 在见面中要求,所有标签的id是唯一的
			 *  */
			Element plistEle = document.getElementById("plist");
			/* 找到循环,重复的商品;li */
			Elements plistLiEles = plistEle.getElementsByTag("li");
			//ConstatFinalUtil.SYS_LOGGER.info("商品数量-->{}",plistLiEles.size());
			JSONArray goodsArr = new JSONArray();
			for (Element pllistTemp : plistLiEles)
			{
				JSONObject goodsJSON = new JSONObject();
				/*---------获取商品名字------*/
				/* 获取的是class为p-name的元素 */
				Elements nameEles = pllistTemp.getElementsByClass("p-name");
				if(nameEles.size() > 0 )
				{
					Element nameEle = nameEles.get(0);
					Elements nameEmEles = nameEle.getElementsByTag("em");
					if(nameEmEles.size() > 0 )
					{
						Element nameEmEle = nameEmEles.get(0);
						/* 商品的名字 */
						String name = nameEmEle.text();
						//ConstatFinalUtil.SYS_LOGGER.info("名字:-->{}",name);
						goodsJSON.put("name", name);
					}
					/* 链接链接 */
					Elements nameAEles = nameEle.getElementsByTag("a");
					if(nameAEles.size() > 0 )
					{
						Element nameAEle = nameAEles.get(0);
						/* 商品的名字 */
						String href = nameAEle.attr("href");
						goodsJSON.put("href", href);
						//ConstatFinalUtil.SYS_LOGGER.info("链接:-->{}",href);
						String goodsId = href.substring(href.lastIndexOf("/") + 1, href.lastIndexOf(".html"));
						//ConstatFinalUtil.SYS_LOGGER.info("商品Id:-->{}",goodsId);
						goodsJSON.put("goodsId", goodsId);
						
						/* 将当前的json添加到数组中 */
						goodsArr.add(goodsJSON);
					}
				}
				
				/*---------获取商品图片------*/
				Elements imgEles = pllistTemp.getElementsByClass("p-img");
				if(imgEles.size() > 0 )
				{
					Element imgEle = imgEles.get(0);
					Elements imgImgEles = imgEle.getElementsByTag("img");
					if(imgImgEles.size() > 0 )
					{
						/* 取第一个标签 */
						Element imgImgEle = imgImgEles.get(0);
						String imgPath = imgImgEle.attr("src");
						/* arr:获取属性 */
						//ConstatFinalUtil.SYS_LOGGER.info("图片路径:-->{}",imgImgEle.attr("src"));
						goodsJSON.put("imgPath", imgPath);
					}
				}
				
				/*---------获取商品价格------*/
				Elements pricePEles = pllistTemp.getElementsByClass("p-price");
				if(pricePEles.size() > 0 )
				{
					Element pricePEle = pricePEles.get(0);
					Elements priceIEles = pricePEle.getElementsByTag("i");
					if(priceIEles.size() > 0 )
					{
						/* 取第一个标签 */
						Element priceIEle = priceIEles.get(0);
						/*
						 * text:开始标签和结束标签中间的内容
						 * */
						//ConstatFinalUtil.SYS_LOGGER.info("图片价格:-->{}",priceIEle.text());
						int price = random.nextInt(900) + 100 ;
						goodsJSON.put("price", price);
					}
				}
			}
			
			dataJSON.put("list", goodsArr);
			
			/*---获取总页数---*/
			Element topPageEle = document.getElementById("J_topPage");
			/* 按照标签获取 */
			Elements topPageIEles = topPageEle.getElementsByTag("i");
			if(topPageIEles.size() > 0 )
			{
				Element topPageIEle = topPageIEles.get(0);
				//ConstatFinalUtil.SYS_LOGGER.info("总页数:-->{}",topPageIEle.text());
				dataJSON.put("totalPage", topPageIEle.text());
			}
			resultJSON.put("data", dataJSON);
			/* 成功 */
			resultJSON.put("code", "0");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("0"));
		} catch (Exception e)
		{
			ConstatFinalUtil.SYS_LOGGER.error("抓取失败了;",e);
			/* 失败 */
			resultJSON.put("code", "-1");
			resultJSON.put("info", ConstatFinalUtil.INFO_JSON.get("-1"));
		}
		return resultJSON ; 
	}
}
